package cn.iocoder.yudao.module.design.service.flow;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.design.controller.admin.flow.vo.*;
import cn.iocoder.yudao.module.design.dal.dataobject.flow.FlowCountDO;
import cn.iocoder.yudao.module.design.dal.dataobject.flow.FlowDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 流程信息 Service 接口
 *
 * @author czw
 */
public interface FlowService {

    /**
     * 创建流程信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createFlow(@Valid FlowCreateReqVO createReqVO);

    /**
     * 更新流程信息
     *
     * @param updateReqVO 更新信息
     */
    void updateFlow(@Valid FlowUpdateReqVO updateReqVO);

    /**
     * 删除流程信息
     *
     * @param id 编号
     */
    void deleteFlow(Long id);

    /**
     * 获得流程信息
     *
     * @param id 编号
     * @return 流程信息
     */
    FlowDO getFlow(Long id);
    /**
     * 验证流程是否存在
     *
     * @param id 流程的ID
     */
    void validateFlowExists(Long id);
    /**
     * 获得流程信息列表
     *
     * @param ids 编号
     * @return 流程信息列表
     */
    List<FlowDO> getFlowList(Collection<Long> ids);

    /**
     * 获得流程信息分页
     *
     * @param pageReqVO 分页查询
     * @return 流程信息分页
     */
    PageResult<FlowDO> getFlowPage(FlowPageReqVO pageReqVO);

    /**
     * 获得流程信息列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 流程信息列表
     */
    List<FlowDO> getFlowList(FlowExportReqVO exportReqVO);

    List<FlowDO> getFlowAll(FlowBaseVO flowBaseVO);

    List<FlowDO> getFlowByStatus(Integer status );

    /**
     * 新建采购流程
     * @param flowCreatePurcharseReqVO
     */
    void createPurchaseFlow(FlowCreatePurcharseReqVO flowCreatePurcharseReqVO);

    /**
     * 查询采购流程
     * @param houseId 项目id
     * @return res
     */
    List<Map> getPurchaseFlow(Long houseId);

    /**
     * 查询流程列表
     * @param flowBaseVO
     * @return
     */
    List<FlowDO> getFlow(FlowBaseVO flowBaseVO);


    List<FlowDO> getFlowByHouseIdAndFlowCd(Long houseId,Integer flowCd);


    List<FlowDO> getFlowAll(Long  houseId);

    void startFlow(Long houseId,Long flowCd);

    void startFlowAll(Long houseId);

    default Map<Long, FlowCountDO> getFlowCountMap(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return new HashMap<>();
        }
        return CollectionUtils.convertMap(getFlowCountList(ids), FlowCountDO::getHouseId);
    }

    List<FlowCountDO> getFlowCountList(Collection<Long> ids);
}
